package sample.xiaosong.violentrecursion;

/**
 * 规定1和A对应、2和B对应、3和C对应...
 * 那么一个数字字符串比如"111"，就可以转化为"AAA"、"KA"和"AK"。
 * 给定一个只有数字字符组成的字符串str，返回有多少种转化结果。
 */
public class ConvertToLetterString {

    public static int getLetterNumber(String str) {
        if (str == null || str.isEmpty()) {
            return 0;
        }
        return process(str.toCharArray(), 0);
    }

    /**
     * 递归函数
     * 对于任意i位置的元素，只需要考虑以下5中情况
     * 1、i位置到达数组最后元素，即可记为一种排列方式，返回1
     * 2、i位置为0,0不能作为开头元素，只能作为10,20的后缀，说明这种排列不可取，返回0
     * 3、i位置为1，直接把当前位置记录为1，或者把当前位置加上下一个位置一起计算，记为1X
     * 4、i位置为2，逻辑与为1时相同，只是需要多判断，2后面至多为20-26
     * 5、i位置为3或者3-9的数字，则只能作为单个数字处理
     * @param chars 数组
     * @param i 元素下标
     * @return 排列方法总数
     */
    public static int process(char[] chars, int i) {
        if (i == chars.length) {
            return 1;
        }

        if (chars[i] == '0') {
            return 0;
        }

        if (chars[i] == '1') {
            int res = process(chars, i + 1);
            if (i + 1 < chars.length) {
                res += process(chars, i + 2);
            }
            return res;
        }

        if (chars[i] == '2') {
            int res = process(chars, i + 1);
            if (i + 1 < chars.length && (chars[i + 1] >= '0' && chars[i + 1] <= 6)) {
                res += process(chars, i + 2);
            }
            return res;
        }

        return process(chars, i + 1);
    }

    public static void main(String[] args) {
        System.out.println(getLetterNumber("112233132"));
    }
}
